package com.example.practica_tresenraya;

import java.util.ArrayList;

import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
/**
 * Clase contenedora de mis metodos y atributos necesarios para controlar la interfaz grafica
 * @author Francisco
 */
public class MyListenerBotones implements OnClickListener {

	private TextView t1;
	private int TurnoJugador = 0;
	private Modelo model = new Modelo();
	private ArrayList arrayBotones;
	private ArrayList arrayBotonesJuego;
	private int metodoDeJuego = 0;

	public void setArrayBotones(ArrayList arrayBotones) {
		this.arrayBotones = arrayBotones;
	}

	public void setArrayBotonesJuego(ArrayList arrayBotonesJuego) {
		this.arrayBotonesJuego = arrayBotonesJuego;
	}

	public TextView getT1() {
		return t1;
	}

	public void setT1(TextView t1) {
		this.t1 = t1;
	}

	@Override
	public void onClick(View v) {

		Button aux = (Button) v;
		this.jugarTurno(model.jugar(aux, arrayBotonesJuego), aux,
				this.getTurnoJugador());
	}

	/**
	 * Metodo para ejecutar la parte grafica de el turno correspondiente
	 * 
	 * @param valor
	 *            valor numerico para definir si el boton pulsado esta
	 *            habilitado o no.
	 * @param boton
	 *            boton pulsado por el usuario.
	 * @param turno
	 *            El turno del jugador correspondiente.
	 */
	public void jugarTurno(int valor, Button boton, int turno) {
		int maq = 0;
		if (valor == 1) {
			switch (this.metodoDeJuego) {
			// Jugador contra Jugacor
			case 1:
				// Turno del jugaor 1
				if (turno == 1) {
					boton.setText("X");
					boton.setEnabled(false);
					String x = model.comprobarGanador(arrayBotonesJuego, "X",maq);
					if (x.equalsIgnoreCase("Empateeee")
							&& !model.isTerminado(arrayBotonesJuego)) {
						this.setTurnoJugador(2);
						t1.setText("Turno Jugador 2. . . ");
					} else {
						t1.setText(x);
						this.terminarJuego(arrayBotones, arrayBotonesJuego);
					}
				}
				// Turno del jugador 2
				else if (turno == 2) {
					boton.setText("O");
					boton.setEnabled(false);
					String x = model.comprobarGanador(arrayBotonesJuego, "O",maq);
					if (x.equalsIgnoreCase("Empateeee")
							&& !model.isTerminado(arrayBotonesJuego)) {
						this.setTurnoJugador(1);
						t1.setText("Turno Jugador 1. . . ");
					}else {
						t1.setText(x);
						this.terminarJuego(arrayBotones, arrayBotonesJuego);
					}
				}
				break;
			// Jugador contra la computadora
			case 2:
				// Turno del jugaor 1
				boton.setText("X");
				boton.setEnabled(false);
				String x = model.comprobarGanador(arrayBotonesJuego, "X",maq);
				if (x.equalsIgnoreCase("Empateeee")
						&& !model.isTerminado(arrayBotonesJuego)) {
					this.setTurnoJugador(2);
					t1.setText("Turno Jugador 2. . . ");
				} else {
					t1.setText(x);
					this.terminarJuego(arrayBotones, arrayBotonesJuego);
				}
				// Turno maquina
				if (!model.isTerminado(arrayBotonesJuego)) {
					model.turnoMaquina(arrayBotonesJuego);
					x = model.comprobarGanador(arrayBotonesJuego, "O",(maq+1));
					if (x.equalsIgnoreCase("Empateeee") 
							&& !model.isTerminado(arrayBotonesJuego)) {
							this.setTurnoJugador(1);
							t1.setText("Turno Jugador 1. . . ");
						} else {
							t1.setText(x);
							this.terminarJuego(arrayBotones, arrayBotonesJuego);
						}
					}
			
				break;
			   }
			}
		
		// Juego aun no iniciado
		else if (valor == 2) {
			this.setMetodoDeJuego(model.establecerMetodoDeJuego(arrayBotones));
			if (this.metodoDeJuego != 0) {
				if (turno == 0) {
					this.setTurnoJugador(1);
					t1.setText("Turno Jugador 1. . . ");
					this.comenzarJuego(arrayBotones, arrayBotonesJuego);
				} else {
					this.resetearInterfaz();
				}
			} else {
				t1.setText("No ah seteado el metodo de juego");
			}
		}
		// Si no hay mas casilleros vacios
		else if (valor == -1) {
			t1.setText("****  Empate  **** ");
			this.terminarJuego(arrayBotones, arrayBotonesJuego);
		}
		// Otro tipo de errores
		else if (valor == 3) {
			System.out.println("Error");
			t1.setText("Error ....  ");
		}
	}

	public int getTurnoJugador() {
		return TurnoJugador;
	}

	public void setTurnoJugador(int turnoJugador) {
		TurnoJugador = turnoJugador;
	}
/**
 * Metodo para terminar el juego, bloquea los botones de juego y habilita los de inicio
 * @param arr arraylist con los botones de Inicio
 * @param botonera arraylist con los botones de juego
 */
	public void terminarJuego(ArrayList arr, ArrayList botonera) {
		Button go = (Button) arr.get(0);
		go.setEnabled(true);
		go.setText("Try Again");
		RadioGroup rg = (RadioGroup) arr.get(1);
		rg.setEnabled(true);
		RadioButton r1 = (RadioButton) arr.get(2);
		r1.setEnabled(true);
		RadioButton r2 = (RadioButton) arr.get(3);
		r2.setEnabled(true);

		for (int i = 0; i < botonera.size(); i++) {
			Button aux = (Button) botonera.get(i);
			aux.setEnabled(false);
		}
		this.setMetodoDeJuego(0);
	}
	/**
	 * Metodo para comenzar el juego, habilita los botones de juego y bloquea los de inicio
	 * @param arr arraylist con los botones de Inicio
	 * @param botonera arraylist con los botones de juego
	 */
	public void comenzarJuego(ArrayList arr, ArrayList botonera) {

		Button go = (Button) arr.get(0);
		go.setEnabled(false);
		RadioGroup rg = (RadioGroup) arr.get(1);
		rg.setEnabled(false);
		RadioButton r1 = (RadioButton) arr.get(2);
		r1.setEnabled(false);
		RadioButton r2 = (RadioButton) arr.get(3);
		r2.setEnabled(false);

		for (int i = 0; i < botonera.size(); i++) {
			Button aux = (Button) botonera.get(i);
			aux.setEnabled(true);
		}
	}
/**
 * Metodo para resetar la interfaz grafica en caso de que el juego haya sido 
 * iniciado previamente
 */
	public void resetearInterfaz() {

		System.out.println("Entra al reset !!!! /***********");
		for (int i = 0; i < this.arrayBotonesJuego.size(); i++) {
			Button aux = (Button) this.arrayBotonesJuego.get(i);
			aux.setText(" ");
		}
		this.setTurnoJugador(1);
		t1.setText("Turno Jugador 1. . . ");
		this.comenzarJuego(arrayBotones, arrayBotonesJuego);
	}

	public int getMetodoDeJuego() {
		return metodoDeJuego;
	}

	public void setMetodoDeJuego(int metodoDeJuego) {
		this.metodoDeJuego = metodoDeJuego;
	}

}
